package com.yn.core.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.transaction.annotation.Transactional;

import com.yn.xr.common.page.PageResult;

/**
 * 
 * @description:使用泛型作为DAO的通用接口
 * @fileName:BaseDao.java
 * @createTime:2015年1月26日 上午11:25:11
 * @author:肖震
 * @version 1.0.0
 * 
 */
public interface BaseDao<T, ID extends Serializable> extends
													 java.io.Serializable
{
	
	 public HibernateTemplate gethibernateTeplate();
	 
	/**
	 * 
	 * description: 根据属性查找对象
	 * 
	 * @param propertyName属性名称
	 * @param value属性值
	 * @return List<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	public List<T> findByProperty(String propertyName, Object value);
	
	/**
	 * 
	 * description: 根据实体查找对象
	 * 
	 * @param entiey 实体（T类型）
	 * @return List<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	public List<T> findByEntity(T entiey);
	
	/**
	 * 
	 * description: 获取记录总数
	 * 
	 * @return int
	 * @author:肖震
	 * @since 1.0.0
	 */
	public int getCount();
	
	/**
	 * 
	 * description:
	 * 
	 * @param entity
	 * @return Long
	 * @author:肖震
	 * @since 1.0.0
	 */
	public Serializable saveBackId(T entity);
	
	/**
	 * 
	 * description: 保存实体
	 * 
	 * @param entity 实体
	 * @author:肖震
	 * @since 1.0.0
	 */
	public void save(T entity);
	
	/**
	 * 
	 * description: 保存实体集合
	 * 
	 * @param collection void
	 * @author:肖震
	 * @since 1.0.0
	 */
	public void saveOrUpdateAll(Collection<T> entities);
	
	/**
	 * 
	 * description: 更新实体
	 * 
	 * @param entity 实体
	 * @author:肖震
	 * @since 1.0.0
	 */
	public void update(T entity);
	
	/**
	 * 
	 * description: 删除实体
	 * 
	 * @param entityids 实体id数组
	 * @author:肖震
	 * @since 1.0.0
	 */
	public void delete(Serializable... entityids);
	
	/**
	 * 
	 * description:批量删除
	 * 
	 * @param entities void
	 * @author:肖震
	 * @since 1.0.0
	 */
	public void deleteAll(Collection<T> entities);
	
	/**
	 * 
	 * description: 删除实体
	 * 
	 * @param entity 实体
	 * @author:肖震
	 * @since 1.0.0
	 */
	public void delete(T entity);
	
	/**
	 * 
	 * description: 查找实体
	 * 
	 * @param entityId 实体id
	 * @return T
	 * @author:肖震
	 * @since 1.0.0
	 */
	@Transactional
	public T findById(Serializable entityId);
	
	/**
	 * 
	 * description: 条件查找
	 * 
	 * @param hql 条件
	 * @return List<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	public List<T> find(String hql);
	
	/**
	 * 条件查找 使用占位符
	 * 
	 * @param hql
	 * @param paramValues
	 * @return
	 */
	public List<T> findPre(String hql, Object... paramValues);
	
	/**
	 * 
	 * @function:
	 * @param hql
	 * @return
	 * @return type List<Object>
	 * @exception
	 * @author:肖震
	 * @since 1.0.0
	 */
	public List findForHql(String hql);
	
	public List findForHqlPre(String hql, Object ... paramValues);
	
	/**
	 * 
	 * description:获取分页数据
	 * 
	 * @param firstindex 开始索引
	 * @param maxresult 每页显示记录数
	 * @param wherejpql where语句
	 * @param queryParams 查询参数
	 * @param orderby 排序序列
	 * @return PageResult<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	public PageResult<T> getScrollData(final int firstindex,
			final int maxresult, final String wherejpql,
			final Object[] queryParams,
			final LinkedHashMap<String, String> orderby);
	
	/**
	 * 
	 * description:
	 * 
	 * @param firstindex
	 * @param maxresult
	 * @param wherejpql
	 * @param orderby
	 * @return PageResult<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	public PageResult<T> getScrollData(final int firstindex,
			final int maxresult, final String wherejpql,
			final LinkedHashMap<String, String> orderby);
	
	/**
	 * 
	 * description: 获取分页数据
	 * 
	 * @param firstindex 开始索引
	 * @param maxresult 每页显示记录数
	 * @param wherejpql where语句
	 * @param queryParams 查询参数
	 * @return PageResult<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	
	public PageResult<T> getScrollData(final int firstindex,
			final int maxresult, final String wherejpql,
			final Object[] queryParams);
	
	/**
	 * 
	 * description: 获取分页数据
	 * 
	 * @param userIdOrigo 开始索引
	 * @param maxresult 每页显示记录数
	 * @param orderby 排序序列
	 * @return PageResult<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	
	public PageResult<T> getScrollData(final int userIdOrigo,
			final int maxresult, final LinkedHashMap<String, String> orderby);
	
	/**
	 * 
	 * description:获取分页数据
	 * 
	 * @param firstindex 开始索引
	 * @param maxresult 每页显示记录数
	 * @return PageResult<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	
	public PageResult<T> getScrollData(final int firstindex, final int maxresult);
	
	/**
	 * 
	 * description:获取所有对象
	 * 
	 * @return PageResult<T>
	 * @author:肖震
	 * @since 1.0.0
	 */
	
	public PageResult<T> getScrollData();
	
	/**
	 * 
	 * @function: 根据Sql查询
	 * @param sql
	 * @return
	 * @return type List
	 * @exception
	 * @author:肖震
	 * @since 1.0.0
	 */
	public List getSQLScrollData(final String sql);
	
	public List getSQLScrollData(final String sql, final Object[] params);
	
	/**
	 * 
	 * @function: 根据Sql查询 分页查询
	 * @param firstindex
	 * @param maxresult
	 * @param sql
	 * @return
	 * @return type PageResult<T>
	 * @exception
	 * @author:肖震
	 * @since 1.0.0
	 */
	public PageResult<T> getSQLScrollData(final int firstindex,
			final int maxresult, final String sql);
	
	/**
	 * 
	 * @function:sql分页查询非泛型
	 * @param firstindex
	 * @param maxresult
	 * @param sql
	 * @return PageResult
	 * @exception
	 * @author:肖震
	 * @since 1.0.0
	 */
	public PageResult getSQLScrollDataNoT(final int firstindex,
			final int maxresult, final String sql);
	
	/**
	 * 
	 * description: 保存或更新
	 * 
	 * @param entity void
	 * @author:肖震
	 * @since 1.0.0
	 */
	public void saveOrUpdate(T entity);
	
	/**
	 * 
	 * @function:使用sql分页查询
	 * @param firstindex
	 * @param maxresult
	 * @param queryParams
	 * @param sql
	 * @return PageResult<T>
	 * @exception
	 * @author:伍俊
	 * @since 1.0.0
	 */
	public PageResult<T> getScrollData(final int firstindex,
			final int maxresult, final Object[] queryParams, final String sql);
	
 
	///////////////////////////////////////////////////////////////////////
	/**
	 * 
	 * @function:  hql分页查询（带条件）
	 * @param preHql 
	 * @param firstindex
	 * @param maxresult
	 * @param wherejpql
	 * @param queryParams
	 * @param orderby
	 * @return PageResult<T>   
	 * @exception 
	 * @author:zengjianjian  
	 * @since  1.0.0
	 */
	public PageResult<T> getScroll(String preHql, int firstindex, int maxresult,
			String wherejpql, Object[] queryParams,
			LinkedHashMap<String, String> orderby);
	
}
